home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 1 / BBS in a box - Trilogy I.iso / Files / Publish / Photoshop / Plug-in Modules / Code / DummyExport.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-15  |  7.3 KB  |  413 lines  |  [TEXT/MPS ]

  1. /*
  2.     File: DummyExport.c
  3.  
  4.     Copyright 1990 by Thomas Knoll.
  5.     Copyright 1993 by Adobe Systems, Inc.
  6.  
  7.     C source file for DummyExport example.
  8. */
  9.  
  10. #include <Types.h>
  11. #include <Memory.h>
  12. #include <Resources.h>
  13. #include <QuickDraw.h>
  14. #include <Dialogs.h>
  15. #include <OSUtils.h>
  16. #include <Packages.h>
  17. #include <Errors.h>
  18. #include <ToolUtils.h>
  19.  
  20. #include "PITypes.h"
  21. #include "PIGeneral.h"
  22. #include "PIExport.h"
  23.  
  24. #include "DialogUtilities.h"
  25. #include "PIUtilities.h"
  26.  
  27. #ifdef THINK_C
  28.  
  29. #define ENTRYPOINT main
  30.  
  31. #endif
  32.  
  33. /*****************************************************************************/
  34.  
  35. typedef struct Globals
  36.     {
  37.  
  38.     short result;
  39.     ExportRecord *stuff;
  40.     
  41.     short fRefNum;
  42.     short vRefNum;
  43.  
  44.     } Globals, *GPtr;
  45.     
  46. #define gResult ((*globals).result)
  47. #define gStuff  ((*globals).stuff)
  48.  
  49. #define gFRefNum ((*globals).fRefNum)
  50. #define gVRefNum ((*globals).vRefNum)
  51.  
  52. /*****************************************************************************/
  53.  
  54. void InitGlobals (GPtr globals);
  55.  
  56. void DoAbout (GPtr globals);
  57. void DoPrepare (GPtr globals);
  58. void DoStart (GPtr globals);
  59. void DoContinue (GPtr globals);
  60. void DoFinish (GPtr globals);
  61.  
  62. /*****************************************************************************/
  63.  
  64. /* All calls to the plug-in module come through this routine. It must be
  65.    placed first in the resource. To achieve this, most development systems
  66.    require that this be the first routine in the source. */
  67.  
  68. pascal void ENTRYPOINT (short selector,
  69.                         ExportRecord *stuff,
  70.                         long *data,
  71.                         short *result)
  72.     {
  73.     
  74.     GPtr globals;
  75.     
  76.     if (!*data)
  77.         {
  78.  
  79.         *data = (long) NewPtr (sizeof (Globals));
  80.         
  81.         if (!*data)
  82.             {
  83.             *result = memFullErr;
  84.             return;
  85.             }
  86.             
  87.         InitGlobals ((GPtr) *data);
  88.         
  89.         }
  90.         
  91.     globals = (GPtr) *data;
  92.         
  93.     gStuff = stuff;
  94.     gResult = noErr;
  95.         
  96.     switch (selector)
  97.         {
  98.         
  99.         case exportSelectorAbout:
  100.             DoAbout (globals);
  101.             break;
  102.             
  103.         case exportSelectorPrepare:
  104.             DoPrepare (globals);
  105.             break;
  106.         
  107.         case exportSelectorStart:
  108.             DoStart (globals);
  109.             break;
  110.         
  111.         case exportSelectorContinue:
  112.             DoContinue (globals);
  113.             break;
  114.         
  115.         case exportSelectorFinish:
  116.             DoFinish (globals);
  117.             break;
  118.             
  119.         default:
  120.             gResult = exportBadParameters;
  121.         
  122.         }
  123.         
  124.     *result = gResult;
  125.         
  126.     }
  127.  
  128. /*****************************************************************************/
  129.  
  130. void InitGlobals (GPtr globals)
  131.     {
  132.     
  133.     #pragma unused (globals)
  134.     
  135.     /* None of the globals requires initialization. */
  136.     
  137.     }
  138.  
  139. /*****************************************************************************/
  140.  
  141. /* Displays the about dialog box for the plug-in module. */
  142.  
  143. void DoAbout (GPtr globals)
  144.     {
  145.  
  146.     #pragma unused (globals)
  147.     
  148.     #define dialogID 17000
  149.     
  150.     ShowAbout (dialogID);
  151.  
  152.     #undef dialogID
  153.  
  154.     }
  155.  
  156. /*****************************************************************************/
  157.  
  158. /* Prepare to export an image.    If the plug-in module needs only a limited
  159.    amount of memory, it can lower the value of the 'maxData' field. */
  160.  
  161. void DoPrepare (GPtr globals)
  162.     {
  163.     
  164.     if (gStuff->maxData > 0x80000)
  165.         gStuff->maxData = 0x80000;
  166.     
  167.     }
  168.  
  169. /*****************************************************************************/
  170.  
  171. void DoInitialRect (GPtr globals);
  172. Boolean DoNextRect (GPtr globals);
  173.  
  174. void DoExportRect (GPtr globals);
  175.  
  176. /*****************************************************************************/
  177.  
  178. /* Requests pointer to the first part of the image to be filtered. */
  179.  
  180. void DoStart (GPtr globals)
  181.     {
  182.     
  183.     OSErr err;
  184.     Point where;
  185.     Str255 prompt;
  186.     SFReply reply;
  187.     StringPtr name;
  188.     DialogTHndl dt;
  189.  
  190.     #define kStringsID 17000
  191.  
  192.     /* This plug-in does not support bitmap images */
  193.  
  194.     if (gStuff->imageMode == plugInModeBitmap)
  195.         {
  196.         gResult = exportBadMode;
  197.         return;
  198.         }
  199.  
  200.     /* Get prompt string */
  201.  
  202.     GetIndString (prompt, kStringsID, 1);
  203.  
  204.     /* Center dialog */
  205.  
  206.     dt = (DialogTHndl) GetResource ('DLOG', putDlgID);
  207.     HNoPurge ((Handle) dt);
  208.  
  209.     CenterDialog (dt);
  210.     where.v = (**dt).boundsRect.top;
  211.     where.h = (**dt).boundsRect.left;
  212.  
  213.     HPurge ((Handle) dt);
  214.  
  215.     /* Ask the user */
  216.     
  217.     name = (StringPtr) &gStuff->filename;
  218.     
  219.     SFPutFile (where, prompt, name, nil, &reply);
  220.  
  221.     if (!reply.good)
  222.         {
  223.         gResult = 1;
  224.         return;
  225.         }
  226.  
  227.     gVRefNum = reply.vRefNum;
  228.     
  229.     /* Create the file. */
  230.  
  231.     err = FSDelete (reply.fName, gVRefNum);
  232.  
  233.     err = Create (reply.fName, gVRefNum, '????', '????');
  234.  
  235.     if (err != noErr)
  236.         {
  237.         gResult = err;
  238.         return;
  239.         }
  240.         
  241.     /* Open the file. */
  242.  
  243.     err = FSOpen (reply.fName, gVRefNum, &gFRefNum);
  244.  
  245.     if (err != noErr)
  246.         {
  247.         gResult = err;
  248.         return;
  249.         }
  250.         
  251.     DoInitialRect (globals);
  252.  
  253.     #undef kStringsID
  254.  
  255.     }
  256.  
  257. /*****************************************************************************/
  258.  
  259. /* Filters the area and requests the next area. */
  260.  
  261. void DoContinue (GPtr globals)
  262.     {
  263.     
  264.     if (TestAbort ())
  265.         {
  266.         gResult = 1;
  267.         return;
  268.         }
  269.         
  270.     DoExportRect (globals);
  271.     
  272.     if (!DoNextRect (globals))
  273.         SetRect (&gStuff->theRect, 0, 0, 0, 0);
  274.  
  275.     }
  276.  
  277. /*****************************************************************************/
  278.  
  279. /* Requests first part of the image to be filtered. */
  280.  
  281. void DoInitialRect (GPtr globals)
  282.     {
  283.     
  284.     gStuff->theRect.top    = 0;
  285.     gStuff->theRect.bottom = 0;
  286.     gStuff->theRect.left   = 0;
  287.     gStuff->theRect.right  = gStuff->imageSize.h;
  288.  
  289.     if (!DoNextRect (globals))
  290.         SetRect (&gStuff->theRect, 0, 0, 0, 0);
  291.     
  292.     }
  293.  
  294. /*****************************************************************************/
  295.  
  296. /* Request the next area. */
  297.  
  298. Boolean DoNextRect (GPtr globals)
  299.     {
  300.  
  301.     /* Compute maximum number of rows we should request at once */
  302.  
  303.     long count = gStuff->maxData / gStuff->imageSize.h / gStuff->planes;
  304.     long top = gStuff->theRect.bottom;
  305.     
  306.     if (top >= gStuff->imageSize.v)
  307.         return FALSE;
  308.  
  309.     if (count < 1)
  310.         count = 1;
  311.  
  312.     gStuff->loPlane = 0;
  313.     gStuff->hiPlane = gStuff->planes - 1;
  314.  
  315.     gStuff->theRect.left  = 0;
  316.     gStuff->theRect.right = gStuff->imageSize.h;
  317.     gStuff->theRect.top   = (short) top;
  318.  
  319.     if (gStuff->theRect.bottom + count > gStuff->imageSize.v)
  320.         gStuff->theRect.bottom = gStuff->imageSize.v;
  321.     else
  322.         gStuff->theRect.bottom = top + count;
  323.  
  324.     return TRUE;
  325.  
  326.     }
  327.  
  328. /*****************************************************************************/
  329.  
  330. /* Filter the area. */
  331.  
  332. void DoExportRect (GPtr globals)
  333.     {
  334.  
  335.     OSErr err;
  336.     short row;
  337.     long count;
  338.  
  339.     for (row = gStuff->theRect.top; row < gStuff->theRect.bottom; row++)
  340.         {
  341.  
  342.         /* See if user was aborted the operation */
  343.  
  344.         if (TestAbort ())
  345.             {
  346.             gResult = 1;
  347.             return;
  348.             }
  349.  
  350.         /* Update the progress indicator */
  351.  
  352.         UpdateProgress ((long) row, (long) gStuff->imageSize.v);
  353.  
  354.         /* Write out this row of the image */
  355.  
  356.         count = gStuff->planes * (long) gStuff->imageSize.h;
  357.  
  358.         err = FSWrite (gFRefNum,
  359.                        &count,
  360.                        (Ptr) ((long) (gStuff->data) +
  361.                                            gStuff->rowBytes *
  362.                                         (row - gStuff->theRect.top)));
  363.  
  364.         if (err != noErr)
  365.             {
  366.             gResult = err;
  367.             return;
  368.             }
  369.  
  370.         }
  371.  
  372.     }
  373.  
  374. /*****************************************************************************/
  375.  
  376. /* This routine will always be called if DoStart does not return an error
  377.    (even if DoContinue returns an error or the user aborts the operation).
  378.    This allows the module to perform any needed cleanup.  None is required
  379.    in this example. */
  380.  
  381. void DoFinish (GPtr globals)
  382.     {
  383.     
  384.     OSErr err;
  385.  
  386.     /* Close the file */
  387.  
  388.     err = FSClose (gFRefNum);
  389.  
  390.     if (err != noErr)
  391.         {
  392.         gResult = err;
  393.         return;
  394.         }
  395.  
  396.     /* Flush the volume */
  397.  
  398.     err = FlushVol (nil, gVRefNum);
  399.  
  400.     if (err != noErr)
  401.         {
  402.         gResult = err;
  403.         return;
  404.         }
  405.  
  406.     /* Clear the image's unsaved changes flag */
  407.  
  408.     gStuff->dirty = false;
  409.     
  410.     }
  411.  
  412. /*****************************************************************************/
  413.